package com.agua.enturno.vista.paginas.turnos;

import com.agua.enturno.excepciones.ExcepcionDeReglaDelNegocio;
import com.agua.enturno.modelo.turno.EstadoDeTurno;
import com.agua.enturno.servicios.TurnoService;
import com.agua.enturno.vista.componentes.ConfirmLink;
import com.agua.enturno.vista.dto.TurnoDTO;
import com.agua.enturno.vista.modelos.DateTimeModel;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.joda.time.DateTime;

import java.util.List;

@SuppressWarnings("serial")
public class TurnosDeClientePanel extends Panel {

	private static final long serialVersionUID = 1L;

	@SpringBean
	private TurnoService turnoService;
	private List<TurnoDTO> turnos;
	
	
	public TurnosDeClientePanel(String id, List<TurnoDTO> turnos) {
		super(id);
		this.turnos = turnos;
		this.setOutputMarkupId(true);
		
		add(new ListView<TurnoDTO>("turnos", new PropertyModel<List<TurnoDTO>>(this, "turnos")) {

			private static final long serialVersionUID = 1L;

			@Override
			protected void populateItem(ListItem<TurnoDTO> item) {
				
				final TurnoDTO turno = item.getModelObject();
				DateTime comienzoDelTurno = turno.getHorario().getIntervalo().getStart();
				
				item.add(new Label("horario", new DateTimeModel(new Model<DateTime>(comienzoDelTurno))));
				item.add(new Label("prestador", turno.getHorario().getAgenda().getPrestadorDeServicios().getNombre()));
				
				Label estadoLabel = new Label("estado", getEstadoSegunPerspectivaDelCliente(turno));
				estadoLabel.add(AttributeModifier.replace("title", turno.getComentarioDelEstado()));
				item.add(estadoLabel);
				
				Link<String> cancelarTurnoLink = new ConfirmLink("cancelar-turno", "¿Realmente desea cancelar el turno?") {

					@Override
					public void onClick() {
						try {
							
							turnoService.cancelarTurno(turno.getId(), turno.getCliente().getId());
							TurnosDeClientePanel.this.turnos.remove(turno);
							
						} catch (ExcepcionDeReglaDelNegocio e) {
							error(e.getMessage());
						}
					}
				};
				item.add(cancelarTurnoLink);
			}

			private String getEstadoSegunPerspectivaDelCliente(final TurnoDTO turno) {
				
				if ( turno.getEstado().equals(EstadoDeTurno.DESHABILITADO) )
					return EstadoDeTurno.DESHABILITADO.toString();
				else
					return "HABILITADO";
			}
		});
		
	}
	
	@Override
	public boolean isVisible() {
		return !turnos.isEmpty();
	}

}
